﻿#ifndef TASKTHREAD_H
#define TASKTHREAD_H



#include <QThread>
#include <QSemaphore>

#include "../include/sql.h"

class SQLThread : public QThread
{
    Q_OBJECT

public:
    enum SQLTasks
    {
        //连接数据库
        ConnectDb,
        //创建表
        CreatTable,
        //插入数据
        InsertData,
        //查询数据
        SelectData,
        NTasks //4
    };

    //很少使用数据队列
    class SQLDataRarelyUsed
    {
    public:
        /*!
         *该构造函数默认为建表指令或者查询指令，由t区分
         */
        SQLDataRarelyUsed(QString& tablename, SQLTasks t) : name(tablename),task(t){}
        /*!
         *该构造函数默认为连接数据库指令
         */
        SQLDataRarelyUsed(const QString& _dbname, const QString& _user, const QString& _pass, SQLTasks t) :
            name(_dbname), user(_user), passwd(_pass), task(t){}

        /*!
         * 用于连接数据库用，用于建表用，用于查询表用
         */
         QString name; //db_name,table_name
        /*!
         * 用于连接数据库用
         */
         QString user;
         QString passwd;
        SQLThread::SQLTasks task;
    };

    //常使用的插入指令队列
    class SQLDataFrequentUsed
    {
        /*!
         * 构造插入数据指令
         */
    public:
       SQLDataFrequentUsed(const QString& _tablename, const QString& _t, uint _id, int station, int sensor, float _data) :
            table(_tablename), time(_t), id(_id), stationNo(station), sensorNo(sensor),data(_data){}

       QString table;
       QString time;
       uint id;
	   int stationNo;
	   int sensorNo;
       float data;
    };

    SQLThread();
    virtual ~SQLThread();
    void run();

    //外部调用，连接到数据库
    void asyncConnectDb(const QString&, const QString&, const QString&);
    //外部调用，创建数据表
    void asyncCreatTable(QString &);
    //外部调用,向表中插入数据
    void asyncInsertData(const QString& _table,const QString& t, uint id, int stationNo, int sensorNo, float _data);
    //外部调用，查询表
    void asyncSelectTable(QString &);
	bool syncLogin(QString &s){
		return sql.execSql(s);
	}
	void ok();
private:
    SQL sql;
    QSemaphore freeSemaphore;
    QSemaphore usedSemaphore;
    QList<SQLDataRarelyUsed> rarelyUsed;
    QList<SQLDataFrequentUsed> frequentUsed;
    bool exitFlag;
    bool haveError;

Q_SIGNALS:
    //异步消息分发
     void openError(const QString&);
     //异步获取查询表的结果
     void getResult(MyVector&, int);
	 void openSqlSuccess();
};
#endif
